package eu.news.data.hibernate.dao;

import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;

import eu.news.data.dao.DAO;

/**
 * 功能描述：持久层对象的基础操作类
 * 
 * @author Eternal
 * 
 */
public abstract class HibernateBaseDAO<T>  implements DAO<T> {

	protected Session session = null;

	protected Transaction trans = null;

	/**
	 * 开始时间
	 */
	protected Date beginTime;

	/**
	 * 结束时间
	 */
	protected Date endTime;

	/**
	 * 构造方法：开始事务
	 * 
	 */
	protected HibernateBaseDAO() {
		trans = getSession().beginTransaction();
	}

	/**
	 * 功能描述：获取当前的session
	 * 
	 * @return session
	 */
	private Session getSession() {
		session = HibernateSessionFactory.getSession();
		return session;
	}

	/**
	 * 提交事务
	 * 
	 */
	public void commit() {
		if (trans == getSession().getTransaction()) 
			trans.commit();
		trans=getSession().beginTransaction();
	}

	/**
	 * 功能描述：回滚数据库操作
	 * 
	 * @throws Exception
	 */
	public void rollback() {
		try {
			if (trans != null && trans.isActive()) {
				trans.rollback();
				trans = null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 保存对象信息到数据库
	 * 
	 * @param obj
	 *            需要持久化的对象
	 */
	public void save(T obj) {
		session.save(obj);
	}

	/**
	 * 保存或更新对象信息到数据库
	 * 
	 * @param obj
	 *            需要持久化的对象
	 */
	public void saveOrUpdate(T obj) {
		session.saveOrUpdate(obj);
	}

	/**
	 * 更新持久化对象
	 * 
	 * @param obj
	 *            需要更新的对象
	 */
	public void update(T obj) {
		session.update(obj);
	}



	/**
	 * 删除一个对象
	 * 
	 * @param obj
	 */
	public void delete(T obj) {
		session.delete(obj);
	}

	/**
	 * 关闭session
	 * 
	 */
	public void close() {
		HibernateSessionFactory.closeSession();
	}

	/**
	 * 更新实体
	 * @param entity
	 */
	public void refresh(T entity){
		session.refresh(entity);
	}
	
	@SuppressWarnings("unchecked")
	public T merge(T entity){
		return (T) session.merge(entity);
	}
}
